package br.ceut.especializacao.poo.livros;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

import br.ceut.especializacao.poo.util.PersistenceMechanismException;
import br.ceut.especializacao.poo.util.PersistenceMechanismRDBMS;
import br.ceut.especializacao.poo.util.RepositorioException;

public class RepositorioLivrosBDR implements RepositorioLivros {

	private static RepositorioLivrosBDR instance;
	private PersistenceMechanismRDBMS pm;

	private RepositorioLivrosBDR() {
		try {
			pm = PersistenceMechanismRDBMS.getInstance();
			pm.connect();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	public synchronized static RepositorioLivrosBDR getInstance() {
		if (instance == null) {
			instance = new RepositorioLivrosBDR();
		}
		return instance;
	}

	public void inserir(Livro livro) throws RepositorioException {
		try {
			Statement statement = (Statement) pm.getCommunicationChannel();
			String query = "INSERT INTO LIVRO(isbn, titulo,editora) VALUES (" + 
					" '" + livro.getIsbn() + "'," +
					" '" + livro.getTitulo() + "'," +
					" '" + livro.getEditora() + "')";
			
			System.out.println(query);
			statement.executeUpdate(query);
			
		} catch (PersistenceMechanismException e) {
			throw new RepositorioException(e);
		} catch (SQLException e) {
			throw new RepositorioException(e);
		} finally {
			try {
				pm.releaseCommunicationChannel();
			} catch (PersistenceMechanismException ex) {
				throw new RepositorioException(ex);
			}
		}
	}

	public void remover(String isbn) throws LivroNaoEncontradoException,RepositorioException {
		try {
			Statement statement = (Statement) pm.getCommunicationChannel();
			String sql = "DELETE FROM LIVRO WHERE isbn='"+ isbn + "'";
			
			System.out.println(sql);
			int i = statement.executeUpdate(sql);
			if (i == 0) {
				throw new LivroNaoEncontradoException(isbn);
			}
		} catch (PersistenceMechanismException e) {
			throw new RepositorioException(e);
		} catch (SQLException e) {
			throw new RepositorioException(e);
		} finally {
			try {
				pm.releaseCommunicationChannel();
			} catch (PersistenceMechanismException ex) {
				throw new RepositorioException(ex);
			}
		}
	}

	public Livro procurar(String isbn) throws LivroNaoEncontradoException,RepositorioException {
		Livro livro = null;
		try {
			Statement statement = (Statement) pm.getCommunicationChannel();
			String sql = "SELECT * FROM LIVRO WHERE isbn = '" + isbn + "'";
			ResultSet resultset = statement.executeQuery(sql);
			System.out.println(sql);
			if (resultset.next()) {

				livro = new Livro(resultset.getInt("idLivro"), resultset.getString("isbn"), resultset.getString("titulo"), resultset.getString("editora"));

			} else {
				throw new LivroNaoEncontradoException(isbn);
			}
			resultset.close();
		} catch (PersistenceMechanismException e) {
			throw new RepositorioException(e);
		} catch (SQLException e) {
			throw new RepositorioException(e);
		} finally {
			try {
				pm.releaseCommunicationChannel();
			} catch (PersistenceMechanismException ex) {
				throw new RepositorioException(ex);
			}
		}
		return livro;
	}

	public void atualizar(Livro livro) throws LivroNaoEncontradoException,
			RepositorioException {
		try {
			Statement statement = (Statement) pm.getCommunicationChannel();
			String sql = "UPDATE LIVRO SET " +
					"isbn = '" + livro.getIsbn() + "', " + 
					" titulo = '" + livro.getTitulo() + "', " +
					" editora = '" + livro.getEditora() + "' " +
					" WHERE idLivro = " + livro.getIdLivro() + "";
			
			int i = statement.executeUpdate(sql);
			
			System.out.println(sql);
			
			if (i == 0) {
				throw new LivroNaoEncontradoException(livro.getIsbn());
			}
		} catch (PersistenceMechanismException e) {
			throw new RepositorioException(e);
		} catch (SQLException e) {
			throw new RepositorioException(e);
		} finally {
			try {
				pm.releaseCommunicationChannel();
			} catch (PersistenceMechanismException ex) {
				throw new RepositorioException(ex);
			}
		}
	}

	public boolean existe(String isbn) throws RepositorioException {
		boolean resposta = false;
		try {
			Statement statement = (Statement) pm.getCommunicationChannel();
			ResultSet resultset = statement.executeQuery("SELECT * FROM LIVRO WHERE isbn = " + isbn + "");
			resposta = resultset.next();
			resultset.close();
			
		} catch (PersistenceMechanismException e) {
			throw new RepositorioException(e);
		} catch (SQLException e) {
			throw new RepositorioException(e);
		} finally {
			try {
				pm.releaseCommunicationChannel();
			} catch (PersistenceMechanismException ex) {
				throw new RepositorioException(ex);
			}
		}
		return resposta;
	}

	public List<Livro> getLivros() throws RepositorioException {
		RepositorioLivros resposta = new RepositorioLivrosArray(100);
		try {
			Statement statement = (Statement) pm.getCommunicationChannel();
			ResultSet resultset = statement.executeQuery("SELECT * FROM LIVRO order by idLivro desc");
			while (resultset.next()) {
				Livro livro = null;
				livro = new Livro(resultset.getInt("idLivro"), resultset.getString("isbn"), resultset.getString("titulo"), resultset.getString("editora"));
				resposta.inserir(livro);
			}
			resultset.close();
		} catch (PersistenceMechanismException e) {
			throw new RepositorioException(e);
		} catch (SQLException e) {
			throw new RepositorioException(e);
		} finally {
			try {
				pm.releaseCommunicationChannel();
			} catch (PersistenceMechanismException ex) {
				throw new RepositorioException(ex);
			}
		}
		return resposta.getLivros();
	}

	public IteratorLivros getIterator() throws RepositorioException {
		return this.getIterator();
	}
}